#include <unistd.h>

#include <iostream>

using namespace std;

int main() {
  cout << "hello world1" << endl;
  cout << "hello world1" << endl;
  cout << "hello world1" << endl;
  printf("当前程序为myproc 且PID为:%d \n", getpid());
  execl("./test_/mytest", "mytest", NULL);
  cout << "hello world2" << endl;
  cout << "hello world2" << endl;
  cout << "hello world2" << endl;
  return 0;
}

// int g_val = 100;

//ps axj | head -1 && ps axj | grep myproc | grep -v grep

// while :; do ps axj | head -1 && ps axj | grep myproc | grep -v grep ; sleep 1 ; done

// int main() {
//   //   cout << "hello world" << endl;

//   pid_t ret = fork();
//   if (ret == 0) {
//     // 子进程
//     int cnt = 5;

//     while (1) {
//       printf("子进程 pid:%d , ppid:%d , g_val:%d , &g_val:%p ,cnt:%d , \n", getpid(),
//              getppid(), g_val ,&g_val,cnt);
//       sleep(1);
//       --cnt;
//       if (cnt == 0) {
//         g_val = 200;
//         /*

//             写时拷贝(写时拷贝是一种延迟申请)

//             由于进程具有独立性,大部分时候子进程与父进程的代码是共享的
//             但是当其中一个进程需要修改其共同的部分时会进行写时拷贝
//             由于此处g_val在创建子进程后父子进程被认为是共同拥有一份代码资源
//             但是由于进程的独立性,其中一个进程在对共同资源进行修改时不能影响另一个进程
//             故在此时进行 写入\修改
//            的进程将会把对应的代码资源在修改\写入后进行一份拷贝,但其他的内存页不进行拷贝从而不占用过多内存

//             写时拷贝发生时子进程被写入或是修改的部分单独拷贝为一个备份
//             而在读取时,由于父子进程在调度队列当中并发,将会共享一个CPU资源,在共享一个CPU资源时操作系统通过切换的方式提高CPU资源的使用效率从而使父子进程来回调用CPU资源
//             而CPU的EIP即pc指针在运行过程中取指令时,若是取到了对应的子进程被修改或者写入的指令时,将会取对应的拷贝部分,其余指令或者代码资源父子进程将共享;
//             使得子进程在自己的视角下可以拥有一份属于自己的代码资源;
//         */
//       }
//     }
//   } else if (ret < 0) {
//     // 创建进程失败
//     cout << "创建进程失败" << endl;
//   } else {
//     // 父进程
//     // printf("父进程 pid:%d , ppid:%d\n", getpid(), getppid());
//     while (1) {
//       printf("父进程 pid:%d , ppid:%d , g_val:%d , &g_val:%p \n", getpid(),
//              getppid(), g_val, &g_val);
//       sleep(1);
//     }
//   }
//   return 0;
// }

// /*
//     进程创建失败的原因 
//     1. 进程过多导致内存不足最终进程创建失败
//     2. 实际用户限制最大进程数量导致进程创建失败
// */


